package br.ufrn.cerescaico.sepe.beans;

import br.ufrn.cerescaico.sepe.util.Constantes;
import java.io.Serializable;
import java.util.Date;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;

/**
 * Classe que representa uma atividade do evento pertencente ao sistema..<br>
 * Sistema de Gerenciamento e Coordenação de Eventos Acadêmicos.
 * @author Taciano Morais Silva - tacianosilva@gmail.com
 * @version 27/08/2010, 12h16m
 * @since 27/08/2010, 12h16m
 */
@Entity
@Table(name = "atividade")
public class Atividade implements Bean, Serializable {

    /**
     * Identificador da atividade.
     */
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(name = "categoria", nullable = false)
    private String categoria;
    @Column(name = "area", nullable = false)
    private String area;
    @ManyToOne
    @JoinColumn(name = "id_participante")
    private Participante participante;
    @Column(name = "titulo", nullable = false, length = 250)
    private String titulo;
    @Column(name = "proponente", nullable = false, length = 150)
    private String proponente;
    @Column(name = "proponente_email", length = 100, nullable = false)
    private String proponenteEmail;
    @Temporal(javax.persistence.TemporalType.DATE)
    @Column(name = "data_submissao", nullable = false)
    private Date dataSubmissao;
    @Column(name = "periodo", length = 100)
    private String periodo;
    @Column(name = "horario", length = 25)
    private String horario;
    @Column(name = "cargaHoraria", length = 10)
    private String cargaHoraria;
    @Column(name = "capacidade")
    private int capacidade;
    @ManyToMany(targetEntity = br.ufrn.cerescaico.sepe.beans.Participante.class,
    cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER)
    @JoinTable(name = "participante_atividade",
    joinColumns = {
        @JoinColumn(name = "id_atividade")},
    inverseJoinColumns = {
        @JoinColumn(name = "id_participante")})
    private Set participantes;
    @ManyToMany(targetEntity = br.ufrn.cerescaico.sepe.beans.Participante.class,
    cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinTable(name = "participante_excluidos_atividade",
    joinColumns = {
        @JoinColumn(name = "id_atividade")},
    inverseJoinColumns = {
        @JoinColumn(name = "id_participante")})
    private Set participantesExcluidos;
    //Arquivos
    @Column(name = "arquivo", nullable=false)
    private byte[] arquivo;
    @Column(name = "nome_arquivo", nullable=false)
    private String nomeArquivo;
    private transient boolean esgotado;
    private transient int inscritos;
    private transient int vagas;

    public Atividade() {
        super();
        this.area = "";
        this.titulo = "";
        this.proponente = "";
        this.periodo = "";
        this.horario = "";
        this.cargaHoraria = "";

        this.capacidade = 0;

        participantes = new TreeSet();
        setInscritos(0);
        setEsgotado(false);
    }

    @Override
    public Integer getId() {
        return id;
    }

    @Override
    public void setId(Integer id) {
        this.id = id;
    }

    public String getCategoria() {
        return categoria;
    }

    public void setCategoria(String categoria) {
        this.categoria = categoria;
    }

    public String getArea() {
        return area;
    }

    public void setArea(String area) {
        this.area = area;
    }

    public Participante getParticipante() {
        if (participante == null) {
            participante = new Participante();
        }
        return participante;
    }

    public void setParticipante(Participante participante) {
        this.participante = participante;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public String getProponente() {
        return proponente;
    }

    public void setProponente(String proponente) {
        this.proponente = proponente;
    }

    public String getProponenteEmail() {
        return proponenteEmail;
    }

    public void setProponenteEmail(String proponenteEmail) {
        this.proponenteEmail = proponenteEmail;
    }

    public Date getDataSubmissao() {
        return dataSubmissao;
    }

    public void setDataSubmissao(Date dataSubmissao) {
        this.dataSubmissao = dataSubmissao;
    }

    /**
     * @hibernate.property length="100"
     */
    public String getPeriodo() {
        return periodo;
    }

    public void setPeriodo(String periodo) {
        this.periodo = periodo;
    }

    /**
     * @hibernate.property length="20"
     */
    public String getHorario() {
        return horario;
    }

    public void setHorario(String horario) {
        this.horario = horario;
    }

    /**
     * @hibernate.property length="10"
     */
    public String getCargaHoraria() {
        return cargaHoraria;
    }

    public void setCargaHoraria(String cargaHoraria) {
        this.cargaHoraria = cargaHoraria;
    }

    /**
     * @hibernate.property
     */
    public int getCapacidade() {
        return capacidade;
    }

    public void setCapacidade(int capacidade) {
        this.capacidade = capacidade;
    }

    /**
     * @hibernate.set role="cursos_participantes" table="curso_participante" readonly="true"
     * @hibernate.collection-key column="cursoID"
     * @hibernate.collection-many-to-many class="org.semac.beans.Participante" column="participanteID"
     */
    public Set getParticipantes() {
        return participantes;
    }

    public void setParticipantes(Set participantes) {
        this.participantes = participantes;
    }

    public void addParticipante(Participante participante) {
        participantes.add(participante);
    }

    public void removeParticipante(Participante participante) {
        participantes.remove(participante);
    }

    public Participante getParticipante(int index) {
        Iterator iter = participantes.iterator();
        for (int i = 0; i < index; i++) {
            iter.next();
        }
        return ((Participante) iter.next());
    }

    /**
     * @hibernate.set role="cursos_participantesExcluidos" table="curso_participanteExcluidos" readonly="true"
     * @hibernate.collection-key column="cursoID"
     * @hibernate.collection-many-to-many class="org.semac.beans.Participante" column="participanteID"
     */
    public Set getParticipantesExcluidos() {
        return participantesExcluidos;
    }

    public void setParticipantesExcluidos(Set participantesExcluidos) {
        this.participantesExcluidos = participantesExcluidos;
    }

    public void addParticipanteExcluidos(Participante participanteExcluido) {
        participantesExcluidos.add(participanteExcluido);
    }

    public void removeParticipanteExcluidos(Participante participanteExcluido) {
        participantesExcluidos.remove(participanteExcluido);
    }

    public Participante getParticipanteExcluidos(int index) {
        Iterator iter = participantesExcluidos.iterator();
        for (int i = 0; i < index; i++) {
            iter.next();
        }
        return ((Participante) iter.next());
    }

    public byte[] getArquivo() {
        return arquivo;
    }

    public void setArquivo(byte[] arquivo) {
        this.arquivo = arquivo;
    }

    public String getNomeArquivo() {
        return nomeArquivo;
    }

    public void setNomeArquivo(String nomeArquivo) {
        this.nomeArquivo = nomeArquivo;
    }
    
    public boolean getEsgotado() {
        if (participantes.size() >= capacidade) {
            this.esgotado = true;
        } else {
            this.esgotado = false;
        }
        return esgotado;
    }

    public void setEsgotado(boolean esgotado) {
        this.esgotado = esgotado;
    }

    public int getInscritos() {
        this.inscritos = participantes.size();
        return inscritos;
    }

    public void setInscritos(int inscritos) {
        this.inscritos = inscritos;
    }

    public int getVagas() {
        this.vagas = getCapacidade() - participantes.size();
        return vagas;
    }

    public void setVagas(int vagas) {
        this.vagas = vagas;
    }

    /**
     * @see java.lang.Comparable#compareTo(java.lang.Object)
     */
    @Override
    public int compareTo(Object arg0) {
        Atividade other = (Atividade) arg0;
        return this.getTitulo().compareTo(other.getTitulo());
    }
}
